/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Servico;

import DAO.UsuarioDAO;
import Modelo.Usuario;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import util.FabricaDeObjetos;
import util.JPAUtil;

/**
 *
 * @author ntpadmin
 */
public class UsuarioService {

    private static UsuarioDAO usuarioDAO;

    static {
        try {
            usuarioDAO = (UsuarioDAO) FabricaDeObjetos.getObjetoUnico(UsuarioDAO.class);            
        } catch (Exception ex) {
            Logger.getLogger(UsuarioService.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void validaInformacoesUsuario(Usuario usuarioCorrente) throws Exception {

        if (isBlank(usuarioCorrente.getNome()) || isBlank(usuarioCorrente.getRg()) || isBlank(usuarioCorrente.getCpf())) {
            throw new Exception("Usuario invalido!");
        }
    }

    private boolean isBlank(String str) {
        return (str == null) || (str.trim().equals(""));
    }

    public List<Usuario> consultar(Usuario usuarioConsulta) throws Exception {

        List<Usuario> retorno = new ArrayList<Usuario>();

        if (!camposEmBranco(usuarioConsulta)) {

            retorno = usuarioDAO.getByFilters(usuarioConsulta);

        } else {
            retorno = usuarioDAO.getAll();
        }

        if (retorno != null && !retorno.isEmpty()) {
            return retorno;
        } else {
            throw new Exception("Nenhum resultado encontrado!");
        }
    }

    public void incluirUsuario(Usuario usuarioCorrente) throws Exception {

        usuarioDAO.insert(usuarioCorrente);        
    }

    public boolean usuarioCadastrado(Usuario usuarioCorrente) {
        
        Usuario retorno = null;
        
        if (usuarioCorrente != null && usuarioCorrente.getId() != null) {
            
            retorno = usuarioDAO.getByPrimaryKey(usuarioCorrente);

        } else {

            List<Usuario> listaUsuarios = usuarioDAO.getByFilters(usuarioCorrente);

            for (Usuario user : listaUsuarios) {

                if (user.getCpf().equals(usuarioCorrente.getCpf()) || user.getRg().equals(usuarioCorrente.getRg())) {

                    retorno = user;

                    break;
                }
            }
        }

        return retorno != null;
    }

    private boolean camposEmBranco(Usuario usuario){
        return (isBlank(usuario.getNome()) && isBlank(usuario.getRg()) && isBlank(usuario.getCpf()) && isBlank(usuario.getMatricula()));
    }

    public void remover(Usuario usuario) {

        JPAUtil.beginTransaction();

        usuarioDAO.remove(usuario);

        JPAUtil.commitTransaction();
    }

    public void editar(Usuario usuario) {
        
        JPAUtil.beginTransaction();

        usuarioDAO.merge(usuario);

        JPAUtil.commitTransaction();
    }

    public void incluir(Usuario usuarioCorrente) throws Exception {

        if (!usuarioCadastrado(usuarioCorrente)) {

            validaInformacoesUsuario(usuarioCorrente);

            incluirUsuario(usuarioCorrente);

        } else {
            throw new Exception("Ja existe um Usuario cadastro com o CPF/RG informados");
        }
    }
}